package def

import "fmt"

type Exception interface {
	error
	Message() string
	Detail() interface{}
	No() int
}

type exception struct {
	info   interface{}
	detail interface{}
	show   bool
	no     int
	t      string
}

func (e *exception) Error() string {
	return fmt.Sprintf("Exception(%d): %s %s", e.no, e.info, e.detail)
}

//  不显示错误：返回错误类型
//  显示错误：
//		字符串错误：显示错误信息
// 		结构类型错误：显示错误类型
func (e *exception) Message() string {
	if !e.show {
		return e.t
	}
	v, ok := e.info.(string)
	if ok {
		return v
	}
	return e.t
}

//  不显示错误：返回空
//  显示错误：显示详细错误
func (e *exception) Detail() interface{} {
	if !e.show {
		return nil
	}
	_, ok := e.info.(string)
	if !ok {
		return e.info
	} else {
		return e.detail
	}
}

func (e *exception) No() int {
	return e.no
}

func GenerateException(no int, t string, showError bool) func(message interface{}) Exception {
	return func(info interface{}) Exception {
		return &exception{
			info,
			nil,
			showError,
			no,
			t,
		}
	}
}
func GenerateExceptionDetail(no int, t string, showError bool) func(message interface{}, detail interface{}) Exception {
	return func(info interface{}, detail interface{}) Exception {
		return &exception{
			info,
			detail,
			showError,
			no,
			t,
		}
	}
}
